<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>原型对象</title>
</head>

<body>
    <p>
        构造函数通过原型分配的函数是所有对象所 共享的。<br>

        - JavaScript 规定，每一个构造函数都有一个 prototype 属性，指向另一个对象，所以我们也称为原型对象<br>
        - 这个对象可以挂载函数，对象实例化不会多次创建原型上函数，节约内存<br>
        - 我们可以把那些不变的方法，直接定义在 prototype 对象上，这样所有对象的实例就可以共享这些方法。<br>
        - 构造函数和原型对象中的this 都指向 实例化的对象
    </p>

    <p>
        JavaScript 中对象的工作机制：当访问对象的属性或方法时，
        先在当前实例对象是查找，然后再去原型对象查找，并且原型对象被所有实例共享。
    </p>

    <p>
        总结：结合构造函数原型的特征，实际开发重往往会将封装的功能函数添加到原型对象中。
    </p>
    <script>
        function Person() {

        }
        console.log(Person.prototype);
        // // 为构造函数的原型对象添加方法
        Person.prototype.sayHi = function () {
            console.log('hi~'); // hi~
        }

        let p1 = new Person()
        p1.sayHi()



        function Person2() {
            // 此处定义同名方法 sayHi
            this.sayHiHi = function () {
                console.log('嗨!'); // 嗨!
            }
        }
        // 为构造函数的原型对象添加方法
        Person2.prototype.sayHiHi = function () {
            console.log('Hi~');
        }
        let p2 = new Person2();
        p2.sayHiHi(); // 输出结果为 嗨!
        // 构造函数 Person 中定义与原型对象中相同名称的方法，
        // 这时实例对象调用则是构造函中的方法 sayHi。




    </script>
</body>

</html>